export default {
	initData(Blobdata) {
		return new Promise((resolve, reject) => {
			let reader = new FileReader();
			reader.readAsArrayBuffer(Blobdata);
			reader.onload = (e) => {
				const bufer = e.srcElement.result;
				const blob = this.addWavHeader(bufer, 16000, 16, 1);
				resolve(window.URL.createObjectURL(blob))
			};
		})
	},
	addWavHeader(samples, sampleRateTmp, sampleBits, channelCount) {
		const dataLength = samples.byteLength;
		/* 新的buffer类，预留44bytes的heaer空间 */
		const buffer = new ArrayBuffer(44 + dataLength);
		/* 转为 Dataview, 利用API来填充字节 */
		const view = new DataView(buffer);
		let offset = 0;
		/* ChunkID, 4 bytes,  资源交换文件标识符 */
		this.writeString(view, offset, 'RIFF'); offset += 4;
		/* ChunkSize, 4 bytes, 下个地址开始到文件尾总字节数,即文件大小-8 */
		view.setUint32(offset, /* 32 */ 36 + dataLength, true); offset += 4;
		/* Format, 4 bytes, WAV文件标志 */
		this.writeString(view, offset, 'WAVE'); offset += 4;
		/* Subchunk1 ID, 4 bytes, 波形格式标志 */
		this.writeString(view, offset, 'fmt '); offset += 4;
		/* Subchunk1 Size, 4 bytes, 过滤字节,一般为 0x10 = 16 */
		view.setUint32(offset, 16, true); offset += 4;
		/* Audio Format, 2 bytes, 格式类别 (PCM形式采样数据) */
		view.setUint16(offset, 1, true); offset += 2;
		/* Num Channels, 2 bytes,  通道数 */
		view.setUint16(offset, channelCount, true); offset += 2;
		/* SampleRate, 4 bytes, 采样率,每秒样本数,表示每个通道的播放速度 */
		view.setUint32(offset, sampleRateTmp, true); offset += 4;
		/* ByteRate, 4 bytes, 波形数据传输率 (每秒平均字节数) 通道数×每秒数据位数×每样本数据位/8 */
		view.setUint32(offset, sampleRateTmp * channelCount * (sampleBits / 8), true); offset += 4;
		/* BlockAlign, 2 bytes, 快数据调整数 采样一次占用字节数 通道数×每样本的数据位数/8 */
		view.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;
		/* BitsPerSample, 2 bytes, 每样本数据位数 */
		view.setUint16(offset, sampleBits, true); offset += 2;
		/* Subchunk2 ID, 4 bytes, 数据标识符 */
		this.writeString(view, offset, 'data'); offset += 4;
		/* Subchunk2 Size, 4 bytes, 采样数据总数,即数据总大小-44 */
		view.setUint32(offset, dataLength, true); offset += 4;
		if (sampleBits === 16) {
			this.floatTo16BitPCM(view, samples);
		} else if (sampleBits === 8) {
			this.floatTo8BitPCM(view, samples);
		} else {
			this.floatTo32BitPCM(view, samples);
		}
		// audio/wav
		return new Blob([view], { type: 'audio/mpeg' });
	},
	writeString(view, offset, string) {
		for (let i = 0; i < string.length; i += 1) {
			view.setUint8(offset + i, string.charCodeAt(i));
		}
	},
	floatTo32BitPCM(output, input) {
		try {
			const oinput = new Int32Array(input);
			let newoffset = 44;
			for (let i = 0; i < oinput.length; i += 1, newoffset += 4) {
				output.setInt32(newoffset, oinput[i], true);
			}
		} catch (err) {
			console.log('floatTo32BitPCM ===== 请注意，报错了 ===== ', err)
		}
	},
	floatTo16BitPCM(output, input) {
		try {
			const oinput = new Int16Array(input);
			let newoffset = 44;
			for (let i = 0; i < oinput.length; i += 1, newoffset += 2) {
				output.setInt16(newoffset, oinput[i], true);
			}
		} catch (err) {
			console.log('floatTo16BitPCM ===== 请注意，报错了 ===== ', err)
		}
	},
	floatTo8BitPCM(output, input) {
		try {
			const oinput = new Int8Array(input);
			let newoffset = 44;
			for (let i = 0; i < oinput.length; i += 1, newoffset += 1) {
				output.setInt8(newoffset, oinput[i], true);
			}
		} catch (err) {
			console.log('floatTo8BitPCM ===== 请注意，报错了 ===== ', err)
		}

	},
}